==hook up==
:set roster characters
 C3/762A 20 91 F0       JSR $F091       init roster (original code)
 C3/762D 20 A0 F0       JSR $F0A0       check and add guest characters
 C3/7630 20 D1 F0       JSR $F0D1       check and init guest characters
 C3/7633 80 03          BRA $7638       continue normal code
:don't start colosseum matchup if invalid party
 C3/ACFA 20 C8 F2       JSR $F2C8       check if item and party is valid
 C3/ACFD 80 00          BRA $ACFF       optimized NOP
 C3/ACFF B0 0D          BCS $AD0E       stop matchup screen if invalid
:don't select guest characters at colosseum
 C3/AE1B 20 C2 F2       JSR $F2C2       load character ID
 C3/AE1E B0 0D          BCS $AE2D       don't load character if ID >= #$0E

==C3/AB71 final battle setup: allow guests to participate==
 C3/AB71 C9 80          CMP #$80        Don't add only if empty or beyond startup index

==C3/F091:init roster==
 C3/F091 A9 FF          LDA #$FF        empty space
 C3/F093 A6 00          LDX $00         null X
 C3/F095 9F 89 9D 7E    STA $7E9D89,X   roster slot
 C3/F099 E8             INX
 C3/F09A E0 A0 00       CPX #$00A0      max number of characters
 C3/F09D D0 F6          BNE $F095       repeat for all characters
 C3/F09F 60             RTS

==C3/F0A0:check and add guest characters==
 init
 C3/F0A0 5A             PHY
 C3/F0A1 7B             TDC
 C3/F0A2 AA             TAX             null X

 check current item for guest adder items
 C3/F0A3 BD 69 18       LDA $1869,X     item id
 C3/F0A6 C9 FF          CMP #$FF        empty item
 C3/F0A8 F0 0C          BEQ $F0B6       skip if item is invalid
 C3/F0AA CF C0 80 ED    CMP $ED80C0	item id of guest #$30
 C3/F0AE F0 0E          BEQ $F0BE       set guest adder as available
 C3/F0B0 CF D6 80 ED    CMP $ED80D6	item id of guest #$31
 C3/F0B4 F0 0C          BEQ $F0C2       set guest adder as available

 search next item
 C3/F0B6 E8             INX             try next item slot
 C3/F0B7 E0 00 01       CPX #$0100      max item slots
 C3/F0BA D0 E7          BNE $F0A3       try all items

 exit                        
 C3/F0BC 7A             PLY
 C3/F0BD 60             RTS

===C3/F0BE:set roster information for guest character===

 guest character #$30
 C3/F0BE A9 0E          LDA #$0E        roster position
 C3/F0C0 80 02          BRA $F0C4

 guest character #$31
 C3/F0C2 A9 0F          LDA #$0F        roster position
 C3/F0C4 A8             TAY

 set roster information for guest
 C3/F0C5 B9 50 18       LDA $1850,Y
 C3/F0C8 29 20          AND #$20        isolate row
 C3/F0CA 09 40          ORA #$40        add guest as available
 C3/F0CC 99 50 18       STA $1850,Y
 C3/F0CF 80 E5          BRA $F0B6       search next item

==C3/F0D1:check and init guest characters==

 init
 C3/F0D1 5A             PHY

 check guest #$30
 C3/F0D2 A9 40          LDA #$40        availability check
 C3/F0D4 2C 5E 18       BIT $185E       roster information
 C3/F0D7 F0 0A          BEQ $F0E3       skip if not available
 C3/F0D9 A9 30          LDA #$30        guest #$30 id
 C3/F0DB CD 06 18       CMP $1806       actual guest identifier
 C3/F0DE F0 03          BEQ $F0E3       skip if already set
 C3/F0E0 20 F6 F0       JSR $F0F6       set data for guest #$30

 check guest #$31
 C3/F0E3 A9 40          LDA #$40        availability check
 C3/F0E5 2C 5F 18       BIT $185F       roster information
 C3/F0E8 F0 0A          BEQ $F0F4       exit if not available
 C3/F0EA A9 31          LDA #$31        guest #$31 id
 C3/F0EC CD 2B 18       CMP $182B       actual guest identifier
 C3/F0EF F0 03          BEQ $F0F4       exit if already set
 C3/F0F1 20 FE F0       JSR $F0FE       set data for guest #$31

 exit                        
 C3/F0F4 7A             PLY
 C3/F0F5 60             RTS

===C3/F0F6:setup guest data===

 setup guest adder #$30 roster index
 C3/F0F6 A2 00 00       LDX #$0000
 C3/F0F9 8E F8 1C       STX $1CF8       roster index difference: guest #$30
 C3/F0FC 80 06          BRA $F104

 setup guest adder #$31 roster index
 C3/F0FE A2 01 00       LDX #$0001
 C3/F101 8E F8 1C       STX $1CF8       roster index difference: guest #$31

 set guest adder #$30 indexes: all are null
 C3/F104 A2 FA 1C       LDX #$1CFA	Start address
 C3/F107 9E 00 00       STZ $0000,X
 C3/F10A E8             INX
 C3/F10B E0 02 1D       CPX #$1D02
 C3/F10E 90 F7          BCC $F107       clear all indexes

 adjust indexes differences if guest is #$31
 C3/F110 AE F8 1C       LDX $1CF8	roster index
 C3/F113 F0 14          BEQ $F129	don't adjust data if guest is #$30
 C3/F115 A9 06          LDA #$06
 C3/F117 8D FA 1C       STA $1CFA       name index difference
 C3/F11A A9 16          LDA #$16
 C3/F11C 8D FC 1C       STA $1CFC       startup index difference
 C3/F11F A9 25          LDA #$25
 C3/F121 8D FE 1C       STA $1CFE       actor index difference
 C3/F124 A9 29          LDA #$29
 C3/F126 8D 00 1D       STA $1D00	entity index difference

 setup data of guest character
 C3/F129 20 33 F1       JSR $F133       set guest data at level 1
 C3/F12C 20 B5 F1       JSR $F1B5       adjust data based on level
 C3/F12F 20 87 F2       JSR $F287       adjust guest npc
 C3/F132 60             RTS

====C3/F133:set initial data====

 init
 C3/F133 AC FE 1C       LDY $1CFE       actor index

 set byte 00:actor id
 C3/F136 AD F8 1C       LDA $1CF8       roster index
 C3/F139 18             CLC
 C3/F13A 69 30          ADC #$30
 C3/F13C 99 06 18       STA $1806,Y     guest id

 set byte 01:sprite
 C3/F13F AE FC 1C       LDX $1CFC	startup index
 C3/F142 BF C1 80 ED    LDA $ED80C1,X	character sprite
 C3/F146 99 07 18       STA $1807,Y     save sprite

 set byte 02-07:name
 C3/F149 5A             PHY
 C3/F14A AE FA 1C       LDX $1CFA       name index
 C3/F14D A9 06          LDA #$06        bytes to copy
 C3/F14F 48             PHA
 C3/F150 BF E0 79 C4    LDA $C479E0,X   name letter (startup)
 C3/F154 99 08 18       STA $1808,Y     name letter (actor)
 C3/F157 68             PLA
 C3/F158 E8             INX
 C3/F159 C8             INY
 C3/F15A 3A             DEC
 C3/F15B D0 F2          BNE $F14F       loop
 C3/F15D 7A             PLY

 set byte 08:level
 C3/F15E A9 01          LDA #$01
 C3/F160 99 0E 18       STA $180E,Y

 set byte 09-13:initial hp, mp and experience
 C3/F163 C2 20          REP #$20        set A as 16-bit
 C3/F165 7B             TDC
 C3/F166 1A             INC
 C3/F167 99 0F 18       STA $180F,Y     current HP
 C3/F16A 99 11 18       STA $1811,Y     max HP
 C3/F16D 99 13 18       STA $1813,Y     current MP
 C3/F170 99 15 18       STA $1815,Y     max MP
 C3/F173 3A             DEC
 C3/F174 99 18 18       STA $1818,Y     experience (high bytes)
 C3/F177 E2 20          SEP #$20
 C3/F179 A9 00          LDA #$00
 C3/F17B 99 17 18       STA $1817,Y     experience (low byte)

 set byte 14-15:status
 C3/F17E 7B             TDC                 null A
 C3/F17F 99 1A 18       STA 181A,Y
 C3/F182 99 1B 18       STA 181B,Y
 
 set byte 16-1D:commands and data
 C3/F185 5A             PHY
 C3/F186 AE FC 1C       LDX $1CFC       startup index
 C3/F189 A9 08          LDA #$08        bytes to copy
 C3/F18B 48             PHA
 C3/F18C BF C2 80 ED    LDA $ED80C2,X
 C3/F190 99 1C 18       STA $181C,Y
 C3/F193 68             PLA
 C3/F194 E8             INX
 C3/F195 C8             INY
 C3/F196 3A             DEC
 C3/F197 D0 F2          BNE $F18B       loop
 C3/F199 7A             PLY									

 set byte 1E:esper
 C3/F19A A9 FF          LDA #$FF        empty
 C3/F19C 99 24 18       STA $1824,Y     esper

 set byte 1F-24:equipment
 C3/F19F 5A             PHY
 C3/F1A0 AE FC 1C       LDX $1CFC       startup index
 C3/F1A3 A9 06          LDA #$06        bytes to copy
 C3/F1A5 48             PHA
 C3/F1A6 BF CF 80 ED    LDA $ED80CF,X
 C3/F1AA 99 25 18       STA $1825,Y
 C3/F1AD 68             PLA
 C3/F1AE E8             INX
 C3/F1AF C8             INY
 C3/F1B0 3A             DEC
 C3/F1B1 D0 F2          BNE $F1A5       loop
 C3/F1B3 7A             PLY

 exit
 C3/F1B4 60             RTS

==C3/F1B5 adjust data based on level==
===C3/F1B5 calculate average level of party===
 init variables
 C3/F1B5 AE DE 1E       LDX $1EDE       Avaliable characters
 C3/F1B8 8E 04 1D       STX $1D04       Save by now
 C3/F1BB A9 FF          LDA #$FF
 C3/F1BD 8D 06 1D       STA $1D06       initial lowest level
 C3/F1C0 A9 00          LDA #$00
 C3/F1C2 8D 07 1D       STA $1D07       initial highest level
 C3/F1C5 7B             TDC
 C3/F1C6 AA             TAX             null X

 check if character is available
 C3/F1C7 C2 20          REP #$20        set A as 16-bit
 C3/F1C9 4E 04 1D       LSR $1D04       get character availability
 C3/F1CC 90 1A          BCC $F1E8       don't check character level if unavailable

 get character offset
 C3/F1CE BF 69 69 C3    LDA $C36969,X   character offset
 C3/F1D2 A8             TAY

 update highest/lowest level from character
 C3/F1D3 E2 20          SEP #$20        set A as 8-bit
 C3/F1D5 B9 08 00       LDA $0008,Y     level
 C3/F1D8 CD 06 1D       CMP $1D06       lowest level
 C3/F1DB B0 03          BCS $F1E0       skip if not lower
 C3/F1DD 8D 06 1D       STA $1D06       set lowest level
 C3/F1E0 CD 07 1D       CMP $1D07       highest level
 C3/F1E3 90 03          BCC $F1E8       skip if not higher
 C3/F1E5 8D 07 1D       STA $1D07       set highest level

 try all characters
 C3/F1E8 E8             INX
 C3/F1E9 E8             INX
 C3/F1EA E0 1C 00       CPX #$001C      max chars without guests
 C3/F1ED 90 D8          BCC $F1C7       repeat

 save average level of party
 C3/F1EF E2 20          SEP #$20        set A as 8-bit
 C3/F1F1 AC FE 1C       LDY $1CFE       actor index
 C3/F1F4 AD 06 1D       LDA $1D06       lowest level
 C3/F1F7 6D 07 1D       ADC $1D07       highest level
 C3/F1FA 4A             LSR
 C3/F1FB 99 0E 18       STA $180E,Y     save average level

===C3/F1FE adjust hp/mp/exp for level===

 init
 C3/F1FE 7B             TDC
 C3/F1FF AA             TAX             current level to add

 add mp by level
 C3/F200 E2 20          SEP #$20        8-bit A                    
 C3/F202 BF 02 F5 E6    LDA $E6F502,X   mp by level
 C3/F206 18             CLC
 C3/F207 79 15 18       ADC $1815,Y
 C3/F20A 99 15 18       STA $1815,Y     new MP
 C3/F20D 90 07          BCC $F216       skip if not overflow
 C3/F20F B9 16 18       LDA $1816,Y
 C3/F212 1A             INC
 C3/F213 99 16 18       STA $1816,Y

 add hp by level
 C3/F216 BF A0 F4 E6    LDA $E6F4A0,X   hp by level
 C3/F21A 18             CLC
 C3/F21B 79 11 18       ADC $1811,Y     
 C3/F21E 99 11 18       STA $1811,Y     new HP
 C3/F221 90 07          BCC $F22A       skip if not overflow
 C3/F223 B9 12 18       LDA $1812,Y
 C3/F226 1A             INC
 C3/F227 99 12 18       STA $1812,Y

 adjust index for exp operations
 C3/F22A C2 20          REP #$20        16-bit A
 C3/F22C DA             PHX
 C3/F22D 8A             TXA
 C3/F22E 0A             ASL             multiply X index by 2
 C3/F22F AA             TAX                        
                        
 add exp by level
 C3/F230 BF 20 82 ED    LDA $ED8220,X   exp by level
 C3/F234 18             CLC
 C3/F235 79 17 18       ADC $1817,Y
 C3/F238 99 17 18       STA $1817,Y     exp
 C3/F23B 90 09          BCC $F246       continue if it doesn't overflow
 C3/F23D E2 20          SEP #$20
 C3/F23F B9 19 18       LDA $1819,Y     highest byte of exp
 C3/F242 1A             INC
 C3/F243 99 19 18       STA $1819,Y     save it

 try next level
 C3/F246 E2 20          SEP #$20        8-bit A
 C3/F248 FA             PLX
 C3/F249 E8             INX
 C3/F24A 8A             TXA
 C3/F24B 1A             INC             adjust level check (there is no level 0 character but index start at 0)
 C3/F24C D9 0E 18       CMP $180E,Y
 C3/F24F 90 AF          BCC $F200       add for next level

===C3/F250 clean up hp/mp/exp===

 clean up MP value
 C3/F251 C2 20          REP #$20        16-bit A
 C3/F253 B9 15 18       LDA $1815,Y     new mp
 C3/F256 C9 E7 03       CMP #$03E7      max mp value: 999
 C3/F259 90 03          BCC $F25E
 C3/F25B A9 E7 03       LDA #$03E7      999
 C3/F25E 99 15 18       STA $1815,Y     save max MP
 C3/F261 99 13 18       STA $1813,Y     save actual MP
                        
 clean up HP value
 C3/F264 B9 11 18       LDA $1811,Y     new HP
 C3/F267 C9 0F 27       CMP #$270F      max hp value: 9999
 C3/F26A 90 03          BCC $F26F       skip if not
 C3/F26C A9 0F 27       LDA #$270F      9999
 C3/F26F 99 11 18       STA $1811,Y     save max HP
 C3/F272 99 0F 18       STA $180F,Y     save actual HP

 multiply exp by 8
 C3/F275 BB             TYX
 C3/F276 A0 03 00       LDY #$0003

 C3/F279 C2 20          REP #$20
 C3/F27B 1E 17 18       ASL $1817,X
 C3/F27E E2 20          SEP #$20
 C3/F280 3E 19 18       ROL $1819,X
                        
 C3/F283 88             DEY
 C3/F284 D0 F3          BNE $F279
 C3/F286 60             RTS                        

==C3/F287 adjust guest NPC==
:init
 C3/F287 E2 20          SEP #$20        8-bit A
 C3/F289 7B             TDC
 C3/F28A AC 00 1D       LDY $1D00       NPC difference index
:main
 C3/F28D 20 B3 F2       JSR $F2B3       get sprite ID and palette
 C3/F290 20 94 F2       JSR $F294       set sprite ID and palette
 C3/F293 60             RTS
 
===C3/F294 set sprite id and palette===
:set NPC sprite
 C3/F294 99 B7 0A       STA $0AB7,Y     set sprite ID
:format NPC pallete
 C3/F297 EB             XBA
 C3/F298 0A             ASL
 C3/F299 8D 06 1D       STA $1D06
:set palette for upper body
 C3/F29C B9 BE 0A       LDA $0ABE,Y
 C3/F29F 29 F1          AND #$F1        remove only palette
 C3/F2A1 0D 06 1D       ORA $1D06       set only palette
 C3/F2A4 99 BE 0A       STA $0ABE,Y
:set palette for lower body
 C3/F2A7 B9 BF 0A       LDA $0ABF,Y
 C3/F2AA 29 F1          AND #$F1
 C3/F2AC 0D 06 1D       ORA $1D06
 C3/F2AF 99 BF 0A       STA $0ABF,Y
:exit
 C3/F2B2 60             RTS

===C3/F2B3 get sprite ID and palette===
 C3/F2B3 AE FC 1C       LDX $1CFC       startup difference
 C3/F2B6 BF C1 80 ED    LDA $ED80C1,X   sprite ID
 C3/F2BA AA             TAX
 C3/F2BB EB             XBA
 C3/F2BC BF 2B CE C2    LDA $C2CE2B,X   get battle palette for sprite
 C3/F2C0 EB             XBA
 C3/F2C1 60             RTS

==C3/F2C2 check if character at colosseum is valid===
 C3/F2C2 20 EC B2       JSR $B2EC       load character ID
 C3/F2C5 C9 0E          CMP #$0E        max valid character
 C3/F2C7 60             RTS

==C3/F2C8 check if item and party at colosseum is valid==
:init
 * C3/F2C8 DA           PHX
   C3/F2C9 BD 69 18     LDA $1869,X     bet item
   C3/F2CC 48           PHA
:check if item is valid
   C3/F2CD C9 FF        CMP #$FF        is the bet item the empty item?
   C3/F2CF F0 0E        BEQ $F2DF       don't allow battle if invalid item
:check if party is valid
   C3/F2D1 7B           TDC             clear A,B
   C3/F2D2 AA           TAX
 * C3/F2D3 B5 69        LDA $69,X       character ID, slot X of party
   C3/F2D5 C9 0E        CMP #$0E        is it a guest character? ID #$0E or higher?
   C3/F2D7 90 0A        BCC $F2E3       allow battle if the character isn't a guest characters
   C3/F2D9 E8           INX
   C3/F2DA E0 04 00     CPX #$0004
   C3/F2DD 90 F4        BCC $F2D3       check the remained characters
:don't allow battle
 * C3/F2DF 68           PLA
   C3/F2E0 FA           PLX
   C3/F2E1 38           SEC
   C3/F2E2 60           RTS
:allow battle
 * C3/F2E3 68           PLA
   C3/F2E4 FA           PLX
   C3/F2E5 18           CLC
   C3/F2E6 60           RTS
